1 module eastasianwidth.eastasianwidth; 2 3 /// East_Asian_Width property 4 enum EastAsianWidthProperty { 5 A, F, H, N, Na, W 6 } 7 8 /// returns East_Asian_Width property of a character 9 EastAsianWidthProperty eastAsianWidth(dchar ch) @safe pure @nogc nothrow { 10 const uint codePoint = ch; 11 if ((codePoint == 12288) || 12 (65281 <= codePoint && codePoint <= 65376) || 13 (65504 <= codePoint && codePoint <= 65510)) return EastAsianWidthProperty.F; 14 if ((codePoint == 8361) || 15 (65377 <= codePoint && codePoint <= 65470) || 16 (65474 <= codePoint && codePoint <= 65479) || 17 (65482 <= codePoint && codePoint <= 65487) || 18 (65490 <= codePoint && codePoint <= 65495) || 19 (65498 <= codePoint && codePoint <= 65500) || 20 (65512 <= codePoint && codePoint <= 65518)) return EastAsianWidthProperty.H; 21 if ((4352 <= codePoint && codePoint <= 4447) || 22 (8986 <= codePoint && codePoint <= 8987) || 23 (9001 <= codePoint && codePoint <= 9002) || 24 (9193 <= codePoint && codePoint <= 9196) || 25 (codePoint == 9200) || 26 (codePoint == 9203) || 27 (9725 <= codePoint && codePoint <= 9726) || 28 (9748 <= codePoint && codePoint <= 9749) || 29 (9800 <= codePoint && codePoint <= 9811) || 30 (codePoint == 9855) || 31 (codePoint == 9875) || 32 (codePoint == 9889) || 33 (9898 <= codePoint && codePoint <= 9899) || 34 (9917 <= codePoint && codePoint <= 9918) || 35 (9924 <= codePoint && codePoint <= 9925) || 36 (codePoint == 9934) || 37 (codePoint == 9940) || 38 (codePoint == 9962) || 39 (9970 <= codePoint && codePoint <= 9971) || 40 (codePoint == 9973) || 41 (codePoint == 9978) || 42 (codePoint == 9981) || 43 (codePoint == 9989) || 44 (9994 <= codePoint && codePoint <= 9995) || 45 (codePoint == 10024) || 46 (codePoint == 10060) || 47 (codePoint == 10062) || 48 (10067 <= codePoint && codePoint <= 10069) || 49 (codePoint == 10071) || 50 (10133 <= codePoint && codePoint <= 10135) || 51 (codePoint == 10160) || 52 (codePoint == 10175) || 53 (11035 <= codePoint && codePoint <= 11036) || 54 (codePoint == 11088) || 55 (codePoint == 11093) || 56 (11904 <= codePoint && codePoint <= 11929) || 57 (11931 <= codePoint && codePoint <= 12019) || 58 (12032 <= codePoint && codePoint <= 12245) || 59 (12272 <= codePoint && codePoint <= 12283) || 60 (12289 <= codePoint && codePoint <= 12350) || 61 (12353 <= codePoint && codePoint <= 12438) || 62 (12441 <= codePoint && codePoint <= 12543) || 63 (12549 <= codePoint && codePoint <= 12589) || 64 (12593 <= codePoint && codePoint <= 12686) || 65 (12688 <= codePoint && codePoint <= 12730) || 66 (12736 <= codePoint && codePoint <= 12771) || 67 (12784 <= codePoint && codePoint <= 12830) || 68 (12832 <= codePoint && codePoint <= 12871) || 69 (12880 <= codePoint && codePoint <= 13054) || 70 (13056 <= codePoint && codePoint <= 19903) || 71 (19968 <= codePoint && codePoint <= 42124) || 72 (42128 <= codePoint && codePoint <= 42182) || 73 (43360 <= codePoint && codePoint <= 43388) || 74 (44032 <= codePoint && codePoint <= 55203) || 75 (63744 <= codePoint && codePoint <= 64255) || 76 (65040 <= codePoint && codePoint <= 65049) || 77 (65072 <= codePoint && codePoint <= 65106) || 78 (65108 <= codePoint && codePoint <= 65126) || 79 (65128 <= codePoint && codePoint <= 65131) || 80 (codePoint == 94176) || 81 (94208 <= codePoint && codePoint <= 100332) || 82 (100352 <= codePoint && codePoint <= 101106) || 83 (110592 <= codePoint && codePoint <= 110593) || 84 (codePoint == 126980) || 85 (codePoint == 127183) || 86 (codePoint == 127374) || 87 (127377 <= codePoint && codePoint <= 127386) || 88 (127488 <= codePoint && codePoint <= 127490) || 89 (127504 <= codePoint && codePoint <= 127547) || 90 (127552 <= codePoint && codePoint <= 127560) || 91 (127568 <= codePoint && codePoint <= 127569) || 92 (127744 <= codePoint && codePoint <= 127776) || 93 (127789 <= codePoint && codePoint <= 127797) || 94 (127799 <= codePoint && codePoint <= 127868) || 95 (127870 <= codePoint && codePoint <= 127891) || 96 (127904 <= codePoint && codePoint <= 127946) || 97 (127951 <= codePoint && codePoint <= 127955) || 98 (127968 <= codePoint && codePoint <= 127984) || 99 (codePoint == 127988) || 100 (127992 <= codePoint && codePoint <= 128062) || 101 (codePoint == 128064) || 102 (128066 <= codePoint && codePoint <= 128252) || 103 (128255 <= codePoint && codePoint <= 128317) || 104 (128331 <= codePoint && codePoint <= 128334) || 105 (128336 <= codePoint && codePoint <= 128359) || 106 (codePoint == 128378) || 107 (128405 <= codePoint && codePoint <= 128406) || 108 (codePoint == 128420) || 109 (128507 <= codePoint && codePoint <= 128591) || 110 (128640 <= codePoint && codePoint <= 128709) || 111 (codePoint == 128716) || 112 (128720 <= codePoint && codePoint <= 128722) || 113 (128747 <= codePoint && codePoint <= 128748) || 114 (128756 <= codePoint && codePoint <= 128758) || 115 (129296 <= codePoint && codePoint <= 129310) || 116 (129312 <= codePoint && codePoint <= 129319) || 117 (codePoint == 129328) || 118 (129331 <= codePoint && codePoint <= 129342) || 119 (129344 <= codePoint && codePoint <= 129355) || 120 (129360 <= codePoint && codePoint <= 129374) || 121 (129408 <= codePoint && codePoint <= 129425) || 122 (codePoint == 129472) || 123 (131072 <= codePoint && codePoint <= 196605) || 124 (196608 <= codePoint && codePoint <= 262141)) return EastAsianWidthProperty.W; 125 if ((32 <= codePoint && codePoint <= 126) || 126 (162 <= codePoint && codePoint <= 163) || 127 (165 <= codePoint && codePoint <= 166) || 128 (codePoint == 172) || 129 (codePoint == 175) || 130 (10214 <= codePoint && codePoint <= 10221) || 131 (10629 <= codePoint && codePoint <= 10630)) return EastAsianWidthProperty.Na; 132 if ((codePoint == 161) || 133 (codePoint == 164) || 134 (167 <= codePoint && codePoint <= 168) || 135 (codePoint == 170) || 136 (173 <= codePoint && codePoint <= 174) || 137 (176 <= codePoint && codePoint <= 180) || 138 (182 <= codePoint && codePoint <= 186) || 139 (188 <= codePoint && codePoint <= 191) || 140 (codePoint == 198) || 141 (codePoint == 208) || 142 (215 <= codePoint && codePoint <= 216) || 143 (222 <= codePoint && codePoint <= 225) || 144 (codePoint == 230) || 145 (232 <= codePoint && codePoint <= 234) || 146 (236 <= codePoint && codePoint <= 237) || 147 (codePoint == 240) || 148 (242 <= codePoint && codePoint <= 243) || 149 (247 <= codePoint && codePoint <= 250) || 150 (codePoint == 252) || 151 (codePoint == 254) || 152 (codePoint == 257) || 153 (codePoint == 273) || 154 (codePoint == 275) || 155 (codePoint == 283) || 156 (294 <= codePoint && codePoint <= 295) || 157 (codePoint == 299) || 158 (305 <= codePoint && codePoint <= 307) || 159 (codePoint == 312) || 160 (319 <= codePoint && codePoint <= 322) || 161 (codePoint == 324) || 162 (328 <= codePoint && codePoint <= 331) || 163 (codePoint == 333) || 164 (338 <= codePoint && codePoint <= 339) || 165 (358 <= codePoint && codePoint <= 359) || 166 (codePoint == 363) || 167 (codePoint == 462) || 168 (codePoint == 464) || 169 (codePoint == 466) || 170 (codePoint == 468) || 171 (codePoint == 470) || 172 (codePoint == 472) || 173 (codePoint == 474) || 174 (codePoint == 476) || 175 (codePoint == 593) || 176 (codePoint == 609) || 177 (codePoint == 708) || 178 (codePoint == 711) || 179 (713 <= codePoint && codePoint <= 715) || 180 (codePoint == 717) || 181 (codePoint == 720) || 182 (728 <= codePoint && codePoint <= 731) || 183 (codePoint == 733) || 184 (codePoint == 735) || 185 (768 <= codePoint && codePoint <= 879) || 186 (913 <= codePoint && codePoint <= 929) || 187 (931 <= codePoint && codePoint <= 937) || 188 (945 <= codePoint && codePoint <= 961) || 189 (963 <= codePoint && codePoint <= 969) || 190 (codePoint == 1025) || 191 (1040 <= codePoint && codePoint <= 1103) || 192 (codePoint == 1105) || 193 (codePoint == 8208) || 194 (8211 <= codePoint && codePoint <= 8214) || 195 (8216 <= codePoint && codePoint <= 8217) || 196 (8220 <= codePoint && codePoint <= 8221) || 197 (8224 <= codePoint && codePoint <= 8226) || 198 (8228 <= codePoint && codePoint <= 8231) || 199 (codePoint == 8240) || 200 (8242 <= codePoint && codePoint <= 8243) || 201 (codePoint == 8245) || 202 (codePoint == 8251) || 203 (codePoint == 8254) || 204 (codePoint == 8308) || 205 (codePoint == 8319) || 206 (8321 <= codePoint && codePoint <= 8324) || 207 (codePoint == 8364) || 208 (codePoint == 8451) || 209 (codePoint == 8453) || 210 (codePoint == 8457) || 211 (codePoint == 8467) || 212 (codePoint == 8470) || 213 (8481 <= codePoint && codePoint <= 8482) || 214 (codePoint == 8486) || 215 (codePoint == 8491) || 216 (8531 <= codePoint && codePoint <= 8532) || 217 (8539 <= codePoint && codePoint <= 8542) || 218 (8544 <= codePoint && codePoint <= 8555) || 219 (8560 <= codePoint && codePoint <= 8569) || 220 (codePoint == 8585) || 221 (8592 <= codePoint && codePoint <= 8601) || 222 (8632 <= codePoint && codePoint <= 8633) || 223 (codePoint == 8658) || 224 (codePoint == 8660) || 225 (codePoint == 8679) || 226 (codePoint == 8704) || 227 (8706 <= codePoint && codePoint <= 8707) || 228 (8711 <= codePoint && codePoint <= 8712) || 229 (codePoint == 8715) || 230 (codePoint == 8719) || 231 (codePoint == 8721) || 232 (codePoint == 8725) || 233 (codePoint == 8730) || 234 (8733 <= codePoint && codePoint <= 8736) || 235 (codePoint == 8739) || 236 (codePoint == 8741) || 237 (8743 <= codePoint && codePoint <= 8748) || 238 (codePoint == 8750) || 239 (8756 <= codePoint && codePoint <= 8759) || 240 (8764 <= codePoint && codePoint <= 8765) || 241 (codePoint == 8776) || 242 (codePoint == 8780) || 243 (codePoint == 8786) || 244 (8800 <= codePoint && codePoint <= 8801) || 245 (8804 <= codePoint && codePoint <= 8807) || 246 (8810 <= codePoint && codePoint <= 8811) || 247 (8814 <= codePoint && codePoint <= 8815) || 248 (8834 <= codePoint && codePoint <= 8835) || 249 (8838 <= codePoint && codePoint <= 8839) || 250 (codePoint == 8853) || 251 (codePoint == 8857) || 252 (codePoint == 8869) || 253 (codePoint == 8895) || 254 (codePoint == 8978) || 255 (9312 <= codePoint && codePoint <= 9449) || 256 (9451 <= codePoint && codePoint <= 9547) || 257 (9552 <= codePoint && codePoint <= 9587) || 258 (9600 <= codePoint && codePoint <= 9615) || 259 (9618 <= codePoint && codePoint <= 9621) || 260 (9632 <= codePoint && codePoint <= 9633) || 261 (9635 <= codePoint && codePoint <= 9641) || 262 (9650 <= codePoint && codePoint <= 9651) || 263 (9654 <= codePoint && codePoint <= 9655) || 264 (9660 <= codePoint && codePoint <= 9661) || 265 (9664 <= codePoint && codePoint <= 9665) || 266 (9670 <= codePoint && codePoint <= 9672) || 267 (codePoint == 9675) || 268 (9678 <= codePoint && codePoint <= 9681) || 269 (9698 <= codePoint && codePoint <= 9701) || 270 (codePoint == 9711) || 271 (9733 <= codePoint && codePoint <= 9734) || 272 (codePoint == 9737) || 273 (9742 <= codePoint && codePoint <= 9743) || 274 (codePoint == 9756) || 275 (codePoint == 9758) || 276 (codePoint == 9792) || 277 (codePoint == 9794) || 278 (9824 <= codePoint && codePoint <= 9825) || 279 (9827 <= codePoint && codePoint <= 9829) || 280 (9831 <= codePoint && codePoint <= 9834) || 281 (9836 <= codePoint && codePoint <= 9837) || 282 (codePoint == 9839) || 283 (9886 <= codePoint && codePoint <= 9887) || 284 (codePoint == 9919) || 285 (9926 <= codePoint && codePoint <= 9933) || 286 (9935 <= codePoint && codePoint <= 9939) || 287 (9941 <= codePoint && codePoint <= 9953) || 288 (codePoint == 9955) || 289 (9960 <= codePoint && codePoint <= 9961) || 290 (9963 <= codePoint && codePoint <= 9969) || 291 (codePoint == 9972) || 292 (9974 <= codePoint && codePoint <= 9977) || 293 (9979 <= codePoint && codePoint <= 9980) || 294 (9982 <= codePoint && codePoint <= 9983) || 295 (codePoint == 10045) || 296 (10102 <= codePoint && codePoint <= 10111) || 297 (11094 <= codePoint && codePoint <= 11097) || 298 (12872 <= codePoint && codePoint <= 12879) || 299 (57344 <= codePoint && codePoint <= 63743) || 300 (65024 <= codePoint && codePoint <= 65039) || 301 (codePoint == 65533) || 302 (127232 <= codePoint && codePoint <= 127242) || 303 (127248 <= codePoint && codePoint <= 127277) || 304 (127280 <= codePoint && codePoint <= 127337) || 305 (127344 <= codePoint && codePoint <= 127373) || 306 (127375 <= codePoint && codePoint <= 127376) || 307 (127387 <= codePoint && codePoint <= 127404) || 308 (917760 <= codePoint && codePoint <= 917999) || 309 (983040 <= codePoint && codePoint <= 1048573) || 310 (1048576 <= codePoint && codePoint <= 1114109)) return EastAsianWidthProperty.A; 311 return EastAsianWidthProperty.N; 312 }